פונקציה אחת מספיקה כדי ליצור תמונות מוקטנות, מוגדלות ומשונות.
הקוד שעובד עם כל פורמט, וההסבר לשירותכם.
לפני מפתחים רבים עומדת שאלת יצירת סקיצה מוקטנת לתצוגה מקדימה. אפשר אפילו לומר שזהו השימוש הכי שכיח של ספריית GD. לפני שנתחיל עם הנושא הזה, רצוי לקרוא על עבודה בסיסית עם תמונות ב ספריית GD.
בספריה הזו קיימת פונקציה imageCopyResampled או בתרגום לעברית — העתק תמונה בדיגום שונה.
בואו נראה קוד המשתמש בפונקציה הזו.
<?php
define('SOURCE', 'original.jpg'); // הקובץ המקורי
define('TARGET', 'small.jpg'); // קובץ התמונה המוקטן -סקיצה
define('NEWX', 100); // רוחב הסקיצה
define('NEWY', 60); // גובה הסקיצה
// מוצאים את גודל התמונה המקורית בעזרת הפונקציה הבאה
$size = getimagesize(SOURCE);
/*
הפונקציה מקבלת כפרמטר שם של קובץ
ומחזירה מערך, שבין היתר מכיל את
אורך $size[0]
ורוחב $size[1]
של התמונה. אגב, אין צורך בספרייה הגרפית כדי להשתמש בה. היא עובדת ישירות
עם הכותרים של הקבצים הגרפיים. במידה ופורמט התמונה לא נתמך או הקובץ הוא אינו תמונה
הפונקציה תחזיר
false */
if ($size === false) die ('Not an image');
/* קוראים את התמונה לזיכרון
שימו לב שהפונקציה
imagecreatefromjpeg
מתאימה לעבודה רק עם תמונות מסוג
jpeg */
$source = imagecreatefromjpeg(SOURCE)or die('Could not load file');
// יוצרים תמונה חדשה ריקה בגודל של הסקיצה
$target = imagecreatetruecolor(NEWX, NEWY);
// מעתיקים את התמונה הקיימת אל הסקיצה עם שינוי גודל
imagecopyresampled(
$target, // התמונה החדשה
$source, // התמונה המקורית אותה מעתיקים
0,0, // קואורדינטת הפינה השמאלית העליונה להדבקה בסקיצה
0,0, // קואורדינטת הפינה השמאלית העליונה להעתקה מהמקור
NEWX, // הרוחב החדש של התמונה
NEWY, // הגובה החדש של התמונה
$size[0], // הרוחב של התמונה המקורית
$size[1] // האורך של התמונה המקורית
);
/* הפונקציה הזו סימנה מלבן
ברוחב size[0]
וגובה size[1]
שהפינה השמאלית שלו נמצאת ב-0,0 על תמונת המקור והעתיקה את המלבן הזה לתוך מלבן
ברוחב NEWX על NEWY
שפינתו השמאלית העליונה נמצאת ב-0.0 בסקיצה.
כלומר סימנה מלבן בגודל כל התמונה המקורית והעתיקה אותו תוך שינוי גודל
למלבן בגודל הסקיצה
*/
// שומרים את התמונה בקובץ JPEG
// פונקציות יצירת קבצי גרפיקה, כמו imagejpeg
// יכולות לא רק לשלוח את התמונה היישר לדפדפן אלה גם לשמור אותם בקובץ
// בשביל זה יש להעביר לפונקציה פרמטר שני - שם של קובץ
// הפונקציה הזאת ספציפית יכולה לקבל גם פרמטר שלישי שהוא איכות התמונה
imagejpeg($target, TARGET, 100);
// כמו תמיד, לא שוכחים לנקות אחרינו את הזיכרון ממידע מיותר
imagedestroy($target);
imagedestroy($source);
?>
define('SOURCE', 'original.jpg'); // הקובץ המקורי
define('TARGET', 'small.jpg'); // קובץ התמונה המוקטן -סקיצה
define('NEWX', 100); // רוחב הסקיצה
define('NEWY', 60); // גובה הסקיצה
// מוצאים את גודל התמונה המקורית בעזרת הפונקציה הבאה
$size = getimagesize(SOURCE);
/*
הפונקציה מקבלת כפרמטר שם של קובץ
ומחזירה מערך, שבין היתר מכיל את
אורך $size[0]
ורוחב $size[1]
של התמונה. אגב, אין צורך בספרייה הגרפית כדי להשתמש בה. היא עובדת ישירות
עם הכותרים של הקבצים הגרפיים. במידה ופורמט התמונה לא נתמך או הקובץ הוא אינו תמונה
הפונקציה תחזיר
false */
if ($size === false) die ('Not an image');
/* קוראים את התמונה לזיכרון
שימו לב שהפונקציה
imagecreatefromjpeg
מתאימה לעבודה רק עם תמונות מסוג
jpeg */
$source = imagecreatefromjpeg(SOURCE)or die('Could not load file');
// יוצרים תמונה חדשה ריקה בגודל של הסקיצה
$target = imagecreatetruecolor(NEWX, NEWY);
// מעתיקים את התמונה הקיימת אל הסקיצה עם שינוי גודל
imagecopyresampled(
$target, // התמונה החדשה
$source, // התמונה המקורית אותה מעתיקים
0,0, // קואורדינטת הפינה השמאלית העליונה להדבקה בסקיצה
0,0, // קואורדינטת הפינה השמאלית העליונה להעתקה מהמקור
NEWX, // הרוחב החדש של התמונה
NEWY, // הגובה החדש של התמונה
$size[0], // הרוחב של התמונה המקורית
$size[1] // האורך של התמונה המקורית
);
/* הפונקציה הזו סימנה מלבן
ברוחב size[0]
וגובה size[1]
שהפינה השמאלית שלו נמצאת ב-0,0 על תמונת המקור והעתיקה את המלבן הזה לתוך מלבן
ברוחב NEWX על NEWY
שפינתו השמאלית העליונה נמצאת ב-0.0 בסקיצה.
כלומר סימנה מלבן בגודל כל התמונה המקורית והעתיקה אותו תוך שינוי גודל
למלבן בגודל הסקיצה
*/
// שומרים את התמונה בקובץ JPEG
// פונקציות יצירת קבצי גרפיקה, כמו imagejpeg
// יכולות לא רק לשלוח את התמונה היישר לדפדפן אלה גם לשמור אותם בקובץ
// בשביל זה יש להעביר לפונקציה פרמטר שני - שם של קובץ
// הפונקציה הזאת ספציפית יכולה לקבל גם פרמטר שלישי שהוא איכות התמונה
imagejpeg($target, TARGET, 100);
// כמו תמיד, לא שוכחים לנקות אחרינו את הזיכרון ממידע מיותר
imagedestroy($target);
imagedestroy($source);
?>
הקוד הזה עובד, אבל העיוותים שיצאו לא פרופורציונליים לא נראים ממש טוב.
בנוסף לזה הקוד לא יצא אוניברסלי. הוא מאפשר לעבוד רק עם תמונות מסוג jpeg עם שמות קבועים וגדלים קבועים. ניצור פונקציה שתפתור בעיות אלו ותעבוד עם כל פורמט שנתמך על ידי ספריית GD.
<?php
/**************************************************************
Resize
פונקציה ליצירת סקיצות
פרמטרים:
$src - שם הקובץ המקורי
$dest - שם הקובץ המוקטן
$maxwidth, $maxheight - רוחב ואורך מרביים לתמונה בפיקסלים
$quality - איכות התמונה המתקבלת. ברירת מחדל - 100. האיכות המרבית
****************************************************************/
function resize($src, $dest, $maxwidth, $maxheight, $quality=100)
{
// אם הקובץ לא קיים - אין לנו מה לעשות איתו
if (!file_exists($src)) return false;
// נקבל את כל הנתונים על התמונה
$size = getimagesize($src);
// אם זא לא תמונה
if ($size === false) return false;
// מבררים את סוג התמונה שגם הוא התקבל על ידי getImageSize
// png, jpeg, gif, bmp, psd, tiff, jpc, ...
// ניצור מחרוזת שתחיל את שם הפונקציה המתאימה לסוג תמונה זה
$format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
$icfunc = "imagecreatefrom" . $format;
// נבדוק שהכן קיימת פונקציה מתאימה לסוג התמונה הזה
// imagecreatefrom[jpeg / png / gif / bmp / ...]
if (!function_exists($icfunc)) return false;
// קצת מתמטיקה. נסו להבין לבד. יהיה הסבר למטה.
$x_ratio = $maxwidth / $size[0];
$y_ratio = $maxheight / $size[1];
$ratio = min($x_ratio, $y_ratio);
$use_x_ratio = ($x_ratio == $ratio);
$new_width = $use_x_ratio ? $maxwidth : floor($size[0] * $ratio);
$new_height = !$use_x_ratio ? $maxheight : floor($size[1] * $ratio);
// טעינת התמונה לזיכרון באמצעות הפונקציה שמצאנו לנכונה עבור סוג תמונה זה
$isrc = $icfunc($src);
$idest = imagecreatetruecolor($new_width, $new_height);
// נצבע את רקה התמונה החדשה בלבן
imagefill($idest, 0, 0, 0xFFFFFF);
imagecopyresampled($idest, $isrc, 0, 0, 0, 0,
$new_width, $new_height, $size[0], $size[1]);
imagejpeg($idest, $dest, $quality);
imagedestroy($isrc);
imagedestroy($idest);
return true;
}
/**************************************************************
Resize
פונקציה ליצירת סקיצות
פרמטרים:
$src - שם הקובץ המקורי
$dest - שם הקובץ המוקטן
$maxwidth, $maxheight - רוחב ואורך מרביים לתמונה בפיקסלים
$quality - איכות התמונה המתקבלת. ברירת מחדל - 100. האיכות המרבית
****************************************************************/
function resize($src, $dest, $maxwidth, $maxheight, $quality=100)
{
// אם הקובץ לא קיים - אין לנו מה לעשות איתו
if (!file_exists($src)) return false;
// נקבל את כל הנתונים על התמונה
$size = getimagesize($src);
// אם זא לא תמונה
if ($size === false) return false;
// מבררים את סוג התמונה שגם הוא התקבל על ידי getImageSize
// png, jpeg, gif, bmp, psd, tiff, jpc, ...
// ניצור מחרוזת שתחיל את שם הפונקציה המתאימה לסוג תמונה זה
$format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
$icfunc = "imagecreatefrom" . $format;
// נבדוק שהכן קיימת פונקציה מתאימה לסוג התמונה הזה
// imagecreatefrom[jpeg / png / gif / bmp / ...]
if (!function_exists($icfunc)) return false;
// קצת מתמטיקה. נסו להבין לבד. יהיה הסבר למטה.
$x_ratio = $maxwidth / $size[0];
$y_ratio = $maxheight / $size[1];
$ratio = min($x_ratio, $y_ratio);
$use_x_ratio = ($x_ratio == $ratio);
$new_width = $use_x_ratio ? $maxwidth : floor($size[0] * $ratio);
$new_height = !$use_x_ratio ? $maxheight : floor($size[1] * $ratio);
// טעינת התמונה לזיכרון באמצעות הפונקציה שמצאנו לנכונה עבור סוג תמונה זה
$isrc = $icfunc($src);
$idest = imagecreatetruecolor($new_width, $new_height);
// נצבע את רקה התמונה החדשה בלבן
imagefill($idest, 0, 0, 0xFFFFFF);
imagecopyresampled($idest, $isrc, 0, 0, 0, 0,
$new_width, $new_height, $size[0], $size[1]);
imagejpeg($idest, $dest, $quality);
imagedestroy($isrc);
imagedestroy($idest);
return true;
}
הסתדרתם עם החישובים?
if (resize('original.jpg', 'small.jpg', 100, 60))
{
echo 'Image resized OK';
}
else
{
echo 'Resize failed!';
}
{
echo 'Image resized OK';
}
else
{
echo 'Resize failed!';
}
ומה בקשר לחישובים?
בגלל שיש לנו מימדים מוגבלים (רוחב מקסימלי 100 וגובה מקסימלי 60) יהיה עלינו לחשב בכמה להקטין את התמונה. רוחב התמונה המקורית שלנו הוא 155. יש להקטין אותה לגודל 100, כלומר פי ~ 1.5 .גובה התמונה הוא 235 ויש להקטין אותה ל 60, פי 4 .
אם נקטין ב-1.5, אזי הרוחב יתאים, אך הגובה יהיה גדול מהמותר.
לכן עלינו להקטין את התמונה במכפיל הגדול מבין השניים.
אם הגובה דורש יותר הקטנה, אז הגובה של הסקיצה יהיה הגובה המרבי, אילו את הרוחב החדש נצטרך לחשב. אם הרוחב של התמונה דורש יותר הקטנה, אז הרוחב יהיה זה המרבי המותר, ואת הגובה החדש נצטרך לחשב.
תגובות לכתבה:
מה אמור להיות בקובץ small?
לא אמור להיות בו כלום.
זה קובץ שיווצר לבד.
איך אני יכול לחבר בין החלק הראשון לחלק השני ?
שיצור את התמונה בגודל מתאים לפי החישוב..
אני לא מצליח
הפונקציה כבר מוכנה. עליך רק לכתוב לה את האורך או הרוחב המירביים שאתה מאפשר והיא תקטין את התמונה בהתאם לגדול מביניהם באופן פרופורציונלי.
עם שאלות ספציפיות לגבי הקוד שלך תוכל לפנות דרך מערכת שאלה-תשובה :)
יפה מאוד! יעזור להרבה אנשים
איפה הוא שמור את קובץ שהוא מקטין , בגלל אני מעלה לו תמונה ומדפיס את תשובה חזורת מפונקציה ואני מקבל דף ריק
resize('original.jpg', 'small.jpg', 100, 60)
הוא שומר אותה בתור small.jpg
כוונה איפה אני מריץ את סקריפט שם הוא שמור את קובץ , small.jpg
בעת ריצת הקוד התמונה מאחסנת במיקום זמני (temp) .
אם אתה רוצה לשמור אותה תעשה קליק ימני -> שמור תמונה בשם וככה תשמור אותה ...
יפה מאוד,מדריך נהדר.
אבל יש דרך לעשות את זה בלי יחס פרופורציונלי?
@itayFO יש כאן שתי קטעי קוד. אחד מהם לא שומר על הפרופורציה של התמונה והשני עושה את זה. מה בדיוק השאלה?
התבלבלתי,מתנצל עלהשאלה המיותרת.
מסיבה כלשהי הקוד עובד לי על הXAMPP ולא על השרת..
עם PHPINFO מצאתי שהPHPGD מותקן..
יש לך רעיון?
זה בסדר. (:
אתה לא רק צריך שההרחבה הזאת תהיה מותקנת, אלא גם מופעלת. הנה מדריך קצר שאומר מה צריך לעשות כדי להפעיל את זה: http://www.webassist.com/tutorials/Enabling-the-GD-library-setting